﻿using System;
// 4.6.1 枚举类型
// Enumerator是只读的，且游标只能在顺序值上向前移，实现下面对象之一：
//    System.Collections.IEnumerator
//    System.Collections.Generic.IEnumerator<T>

//foreach语句用来在可枚举的对象上执行迭代操作。可枚举对象是顺序表的逻辑表示，它本身不是一个游标，但对象自身产生游标。可枚举对象是：
//    IEnumerable或IEnumerable<T>的实现
//    具有名为GetEnumerator的方法返回一个enumerator
//提示：IEnumerator和IEnumerable在System.Collections命名空间中定义。IEnumerator<T>和IEnumerable<T>在System.Collection.Generic命名空间中定义。

//枚举类型的模板如下：
/*
class Enumerator // 通常实现IEnumerator或IEnumerator<T>
{
    public IteratorVariableType Current { get { } }
    public bool MoveNext() { }
}
class Enumerable // 通常实现IEnumerable或IEnumerable<T>
{
    public Enumerable GetEnumerator() { }
}
*/

namespace _108_枚举类型的迭代_枚举类型
{
    class Program
    {
        static void Main(string[] args)
        {
            //下面是用高级方法即foreach语句，遍历单词beer的每个单词：
            foreach (char c in "beer")
                Console.WriteLine(c);
            //下面是用低级方法即不用foreach语句，遍历单词beer的每个单词：
            using (var enumerator = "beer".GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    var element = enumerator.Current;
                    Console.WriteLine(element);
                }
            }
            //如果enumerator实现了IDisposable，那么foreach语句也起到using语句的作用，像前面讲过的例子那样隐式释放枚举对象。

            Console.ReadKey();
        }
    }
}